package com.cskaoyan.javase.basic._2variable._3detail;

/**
 * 之前我们提到过，Java是强类型语言
 * 一个变量必须明确它的数据类型，并且数据类型一旦确定不能随意更改。
 * 但不能随意修改并不是不能更改，而是需要一定的条件
 * Java中变量的数据类型由某一种转换为另一种，我们将这个过程叫做数据类型转换。
 * 我们之前提到过：
 * 声明是告诉编译器变量的数据类型，那么数据类型的转换，也同样是要告诉编译器怎么转换，转换成了什么数据类型。
 *
 * 数据类型的转换又可以分为两类：
 *      1.自动类型转换
 *      2.强制类型转换
 * 接下来，我们以基本数据类型为例，讲一下这两种类型转换。
 * 当然，首先要明确的是：
 *      基本数据类型的数据类型转换必须在byte、short、int、long、float、double这些数值类型和char类型之间进行
 *      boolean类型不参与基本数据类型的数据类型转换。
 *
 * 基本数据类型的自动类型转换:
 *      定义: 指的是无需程序员写额外代码完成类型转换,而是由编译器自动完成类型转换
 *      条件: 考虑"取值范围"
 *          小取值范围的数据类型看成是一个装水的杯子
 *          大取值范围的数据类型看成是一个装水的水桶
 *          水桶比杯子大
 *          现在怎么倒水,才能够保证一定不会溢出呢? 小到大 一定不会溢出
 *          当"小取值范围"的数值类型变量,转换成"大取值范围"的数值类型变量时,该过程编译器自动完成
 *          是自动类型转换
 *
 *       思考:
 *          基本数据类型的自动类型转换是一定安全的吗?一定不会出现数据失真吗?
 *          不是的,某些极其特殊的情况下,仍然会出现数据失真(主要还是浮点数的精度问题)
 *          比如
 *          int(最大可以是十位数) --> float（有效位数7~8位）有可能产生精度问题
 *          long --> float 有可能产生精度问题
 *          int --> double (有效数字16~17位）没有精度问题
 *          long --> double (有效数字16~17位）有可能产生精度问题
 *
 * 基本数据类型的强制类型转换:
 *      定义: 指的是编译器不再自动完成类型转换,而是必须由程序员使用特殊语法完成类型转换,如果不写特殊语法,会编译报错
 *      条件:
 *          当"大取值范围"的数值类型变量,转换成"小取值范围"的数值类型变量时,该过程编译器不会自动完成,需要手动转换
 *      语法:
 *          转换成的目标数据类型 变量名 = (转换成的目标数据类型)被转换的目标变量;
 *      注意:
 *          强转是很危险的,很容易导致数据失真,所以该过程编译器不会自动完成
 *
 *
 * 引申:
 *      既然基本数据类型能够进行类型转换,那么引用数据类型可以吗?
 *      当然有
 *      引用数据类型的类型转换和基本数据类型的类型转换有相似的地方,但又完全不同
 *
 *
 * @since 17:07
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        int a = 10;
        // 10默认当成int处理,这里存在int-->long,是自动类型转换,无需程序员写额外代码转换,所以不会报错
        long b = 10;

        double c = 0.1;
        float d = 0.1F;
        // 0.1默认当做double处理,double --> float 是大到小,是强转,所以需要手动写代码完成
        // float e = 0.1;
        float e = (float) 0.1;

        int num = 123456789;
        // int --> float 自动类型转换
        float floatNum = num;
        System.out.println(floatNum);

        // 使用强转去掉小数部分,也就是取整
        double num1 = 123.11;
        int num2 = (int) num1;
        System.out.println(num2);

        /*
            有关表达式使用的快捷键
            在写有"="赋值的表达式时,建议不要从左往右写,而是从右往左写
            先写右边,然后用快捷键自动生成左边:
                1.".var"
                2."ctrl + alt + V"
         */
        int result = (int) num1;
        int result2 = (int) num1;
    }
}
